﻿using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using Business;
using Business.Entity.Contabil;
using Business.Entity.Contabil.Pessoa;
using Business.Entity.Contabil.Pessoa.ClassesRelacionadas.Endereco;
using Business.Entity.Contabil.Pessoa.SubClass.Empresa;
using Business.Entity.Contabil.Pessoa.SubClass.Usuario;
using Business.Entity.Sistema;
using Business.Entity.Sistema.Terminal;
using Business.Entity.Sped;
using Business.Entity.Sped.ClassesRelacionadas;
using Business.Enum;
using Business.Forms;
using Business.InformacoesIniciais;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;

namespace CreateDb
{
    public partial class FormCreatDb : Form
    {
        public FormCreatDb()
        {
            InitializeComponent();
        }

        public ISessionFactory GetFactory()
        {
            try
            {
                var strCnn = "Server=" + server.Text + ";" +
                             "Port=" + port.Text + ";" +
                             "User Id=" + user.Text + ";" +
                             "Password=" + password.Text + ";" +
                             "Database=" + dataBase.Text + ";";
                return FluentNHibernate.Cfg.Fluently
                        .Configure()
                        .Database(PostgreSQLConfiguration.PostgreSQL82.ConnectionString(strCnn))
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Pessoa>())
                        .BuildSessionFactory();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao criar session factory." + ex.Message);
            }
            

            return null;
        }
        private void cmdCriar_Click(object sender, EventArgs e)
        {

            using (var i = new FormAutenticacaoInicial())
            {
                i.ShowDialog();
                var result = i.DialogResult;
                if (result == DialogResult.Cancel)
                {
                    return;
                }
            }

            DialogResult rs = MessageBox.Show(this, "Esta operação cria o banco de dados. \n" +
                           "Mas caso o banco de dados já exista ele será apagado.\n\n" +
                           "Deseja realmente executar esta operação?", "Atenção", MessageBoxButtons.OKCancel);
            try
            {
                if (rs == DialogResult.OK)
                {

                    var strCnn = "Server=" + server.Text + ";" +
                                 "Port=" + port.Text + ";" +
                                 "User Id=" + user.Text + ";" +
                                 "Password=" + password.Text + ";" +
                                 "Database=" + dataBase.Text + ";";
                    splashScreenManager.ShowWaitForm();
                    if (ckGearArquivo.Checked)
                    {
                        FluentNHibernate.Cfg.Fluently
                            .Configure()
                            .Database(PostgreSQLConfiguration.PostgreSQL82.ConnectionString(strCnn))
                            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TipoLancamento>())
                            .ExposeConfiguration(config => new SchemaUpdate(config).Execute(false, true))
                            .BuildSessionFactory();
                    }
                    else
                    {
                        FluentNHibernate.Cfg.Fluently
                        .Configure()
                        .Database(PostgreSQLConfiguration.PostgreSQL82.ConnectionString(strCnn))
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TipoLancamento>())
                        .ExposeConfiguration(config =>
                            {
                                var schema = new SchemaExport(config);

                                
                                schema.Execute(true,true,true);
                                schema.Create(false, true);
                            })
                        .BuildSessionFactory();

                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao criar banco de dados.\n" + ex.Message);
                if (splashScreenManager.IsSplashFormVisible)
                {
                    splashScreenManager.CloseWaitForm();
                }
            }

        }

        //public void CanGenerateDatabaseSchema()
        //{
        //    var session = NHibernateSession.GetDefaultSessionFactory().OpenSession();
        //    using (TextWriter stringWriter = new StreamWriter("../../../../db/schema/UnitTestGeneratedSchema.sql"))
        //    {
        //        new SchemaExport(configuration).Execute(true, false, false, session.Connection, stringWriter); 
                
        //    }
        //} 
        //public void CanConfirmDatabaseMatchesMappings() 
        //{ 
        //    var allClassMetadata = NHibernateSession.GetDefaultSessionFactory().GetAllClassMetadata();
        //    foreach (var entry in allClassMetadata)
        //    {
        //        NHibernateSession.Current.CreateCriteria(entry.Value.GetMappedClass(EntityMode.Poco)).SetMaxResults(0).List(); 
                
        //    } 
        //}
        private void cmdPlanoContaPadrao_Click(object sender, EventArgs e)
        {
            if (!txtNcmInicial.Text.Equals(""))
            {

                DadosIniciaisNcm.NcmInicial = txtNcmInicial.Text;
            }

            DadosIniciaisNcm.GerarArquivo = ckGearArquivo.Checked;
            DadosIniciaisNcm.IniciarDados(GetFactory().OpenSession());

        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            splashScreenManager.ShowWaitForm();
            var session = GetFactory().OpenSession();
            try
            {
                UsuarioRepository.Session = session;
                PessoaRepository.Session = UsuarioRepository.GetSession();
                var pessoa = PessoaRepository.GetById(1);
                var u = new Usuario
                {
                    Pessoa = pessoa,
                    Login = "MASTER",
                    Senha = new Criptografia.CriptHash().GetHash("MASTER"),
                    UsaRetaguarda = true,
                    TipoUsuario = TipoUsuario.SuperAdministrador,
                };
                UsuarioRepository.Save(u);

            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro!!!\n" + ex.Message);

            }
            splashScreenManager.CloseWaitForm();
        }

        private void simpleButton2_Click(object sender, EventArgs e)
        {

            var session = GetFactory().OpenSession();
            var t = session.BeginTransaction();
            try
            {
                // Inicia os dados de endereço.
                DadosIniciaisEndereco.SaveEndereco(session);
                // Inicia os dados no banco.1
                DadosIniciais.Factory = GetFactory();
                DadosIniciais.Iniciar();

                // Abre o cadastro de empresa.
                EmpresaRepository.Session = session;
                new FormEmpresa().ShowDialog();
                splashScreenManager.ShowWaitForm();

                // Inicia os dados do terminal inicial.
                DadosIniciais.Empresa = FormSelecionarEmpresa.GetEmpresa();

                if (DadosIniciais.Empresa == null)
                {
                    MessageBox.Show("Não é possível continuar sem a informação da empresa.\n" +
                                    "Por favor reinicie a operação.");
                    return;
                }
                splashScreenManager.CloseWaitForm();
                t.Commit();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void simpleButton3_Click(object sender, EventArgs e)
        {
            var session = GetFactory().OpenSession();
            ITransaction t = session.BeginTransaction();
            try
            {
                EmpresaRepository.Session = session;
                EnderecoRepository.Session = session;
                new FormEmpresa().ShowDialog();
                t = session.BeginTransaction();


                // Inicia os dados do terminal inicial.
                DadosIniciais.Empresa = FormSelecionarEmpresa.GetEmpresa();

                if (DadosIniciais.Empresa == null)
                {
                    MessageBox.Show("Não é possível continuar sem a informação da empresa.\n" +
                                    "Por favor reinicie a operação.");
                    return;
                }
                splashScreenManager.ShowWaitForm();
                // Inicia o terminal
                DadosIniciaisTerminal.IniciarTerminal(session);
                DadosIniciais.IniciaConfiguracoes(session);
                t.Commit();
                splashScreenManager.CloseWaitForm();

            }
            catch (Exception ex)
            {
                if (splashScreenManager.IsSplashFormVisible)
                {
                    splashScreenManager.CloseWaitForm();
                }
                MessageBox.Show(ex.Message);
            }
        }

        private void simpleButton4_Click(object sender, EventArgs e)
        {
            new FormSchema(this).ShowDialog();
        }
    }
}
